/*
 * Filename:    IndicationHospitalHelp.java
 * Copyright:   2014 中国平安保险（集团）股份有限公司 版权所有
 * Company:     平安科技养老险及健康险系统开发部
 * Create at:   2014年10月18日
 */
package com.paic.mhis.hcpms.quota.settlement.biz.service.impl;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.biz.service.KpiCoreDataService;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiCateDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiConditionDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiGradeDTO;
import com.paic.mhis.hcpms.quota.settlement.common.Constants;
import com.paic.mhis.hcpms.quota.settlement.dto.IndicationBeanDTO;

@Component("indicationHospitalHelp")
public class IndicationHospitalHelp {

	@Autowired
	private KpiCoreDataService kpiCoreDataService;


	/**
	 * 根据医疗机构类型查询指标
	 * 
	 * @param kpiGradeList
	 * @param kpiConditionDTO
	 * @return
	 */
	public List<IndicationBeanDTO> getIndicationBeanDTOByOrgCategory(List<KpiCateDTO> kpiGradeList,
			KpiConditionDTO kpiConditionDTO) {

		List<IndicationBeanDTO> returnList = new ArrayList<IndicationBeanDTO>();

		//根据获取机构类型的值
		for(String cate : kpiConditionDTO.getCateList()){
			IndicationBeanDTO indicationBean = new IndicationBeanDTO();
			// 同比
			indicationBean.setYoy(0d);
			// 环比
			indicationBean.setMom(0d);
			//机构类型
			indicationBean.setOrgCategory(cate);
			//统筹区域
			indicationBean.setRegionCode(kpiConditionDTO.getSociationCode());
			//遍历获取的值
			for (KpiCateDTO bean : kpiGradeList) {
				//判断是否是当前等级下的数据
				if (cate.equals(bean.getCategory())) {
					//根据最后的日期 赋值同比和环比值
					this.getOrgCategoryRatio(bean,indicationBean,kpiConditionDTO.getKpiTimeEnd());
					//获取名称
					indicationBean.setName(bean.getCategoryName());
					// 获取 统计时间的月份
					String kpiMonth = this.getMonth(bean.getKpiTime()); 
					// 指标值
					BigDecimal monthValue = bean.getKpiValue(); 
					
					//根据日期赋值
					this.makeMonthValue(indicationBean, kpiMonth, monthValue);
				}
			}
			// 获取子节点数目
			kpiConditionDTO.setCate(cate);
			
			int count = this.kpiCoreDataService.queryKpiAnalyzeCountByOrg(kpiConditionDTO);
			
			indicationBean.setCount(count);
			
			if (StringUtils.hasText(indicationBean.getName())) {
				returnList.add(indicationBean);
			}
		}
		return returnList;

	}
	
	/**
	 * 赋值同比环比值
	 * @param bean
	 * @param indicationBean
	 * @param endTime
	 */
	private void getOrgCategoryRatio(KpiCateDTO bean,IndicationBeanDTO indicationBean,String endTime){
		if (bean.getKpiTime().equals(endTime)) {
			//同比
			if (null != bean.getPeriodRatio()) {
				indicationBean.setYoy(bean.getPeriodRatio().doubleValue());
			}
			//环比
			if (null != bean.getChainRatio()) {
				indicationBean.setMom(bean.getChainRatio().doubleValue());
			}
		}
	}

	/**
	 * 
	 * @param kpiGradeList
	 * @return
	 */
	public List<IndicationBeanDTO> getIndicationBeanDTOByHospitalLevel(List<KpiGradeDTO> kpiGradeList,
			KpiConditionDTO kpiConditionDTO) {

		List<IndicationBeanDTO> returnList = new ArrayList<IndicationBeanDTO>();

		//根据获取机构等级的值
		for(String level : kpiConditionDTO.getGradeList()){
			IndicationBeanDTO indicationBean = new IndicationBeanDTO();
			// 同比
			indicationBean.setYoy(0d);
			// 环比
			indicationBean.setMom(0d);
			//机构等级
			indicationBean.setLevel(Integer.valueOf(level));
			//统筹区域
			indicationBean.setRegionCode(kpiConditionDTO.getSociationCode());
			//遍历获取的值
			for (KpiGradeDTO bean : kpiGradeList) {
				//判断是否是当前等级下的数据
				if (level.equals(bean.getGrade())) {
					//根据最后的日期 赋值同比和环比值
					this.getOrgLevelRatio(bean,indicationBean,kpiConditionDTO.getKpiTimeEnd());
					
					//获取名称
					indicationBean.setName(bean.getGradeName());
					// 获取 统计时间的月份
					String kpiMonth = this.getMonth(bean.getKpiTime()); 
					// 指标值
					BigDecimal monthValue = bean.getKpiValue(); 
					
					//根据日期赋值
					this.makeMonthValue(indicationBean, kpiMonth, monthValue);
				}
			}
			
			// 获取子节点数目
			kpiConditionDTO.setGrade(level);
			
			int count = this.kpiCoreDataService.queryKpiAnalyzeCountByOrg(kpiConditionDTO);
			
			indicationBean.setCount(count);
			
			if (StringUtils.hasText(indicationBean.getName())) {
				returnList.add(indicationBean);
			}
		}
		return returnList;
	}
	
	/**
	 * 赋值同比环比值
	 * @param bean
	 * @param indicationBean
	 * @param endTime
	 */
	private void getOrgLevelRatio(KpiGradeDTO bean,IndicationBeanDTO indicationBean,String endTime){
		if (bean.getKpiTime().equals(endTime)) {
			//同比
			if (null != bean.getPeriodRatio()) {
				indicationBean.setYoy(bean.getPeriodRatio().doubleValue());
			}
			//环比
			if (null != bean.getChainRatio()) {
				indicationBean.setMom(bean.getChainRatio().doubleValue());
			}
		}
	}
	
	/**
	 * 月份赋值
	 * @param bean
	 * @param month
	 * @param monthValue
	 */
	private void makeMonthValue(IndicationBeanDTO bean, String month, BigDecimal monthValue) {
		if (Constants.month_01.equals(month)) {
			if (monthValue != null) {
				bean.setFirst(monthValue.doubleValue());
			} else {
				bean.setFirst(0d);
			}

		}
		if (Constants.month_02.equals(month)) {
			if (monthValue != null) {
				bean.setSecond(monthValue.doubleValue());
			} else {
				bean.setSecond(0d);
			}

		}
		if (Constants.month_03.equals(month)) {
			if (monthValue != null) {
				bean.setThird(monthValue.doubleValue());
			} else {
				bean.setThird(0d);
			}

		}
		if (Constants.month_04.equals(month)) {
			if (monthValue != null) {
				bean.setFourth(monthValue.doubleValue());
			} else {
				bean.setFourth(0d);
			}
		}
		if (Constants.month_05.equals(month)) {
			if (monthValue != null) {
				bean.setFifth(monthValue.doubleValue());
			} else {
				bean.setFifth(0d);
			}
		}
		if (Constants.month_06.equals(month)) {
			if (monthValue != null) {
				bean.setSixth(monthValue.doubleValue());
			} else {
				bean.setSixth(0d);
			}

		}
		if (Constants.month_07.equals(month)) {
			if (monthValue != null) {
				bean.setSeventh(monthValue.doubleValue());
			} else {
				bean.setSeventh(0d);
			}
		}
		if (Constants.month_08.equals(month)) {
			if (monthValue != null) {
				bean.setEighth(monthValue.doubleValue());
			} else {
				bean.setEighth(0d);
			}
		}
		if (Constants.month_09.equals(month)) {
			if (monthValue != null) {
				bean.setNinth(monthValue.doubleValue());
			} else {
				bean.setNinth(0d);
			}
		}
		if (Constants.month_10.equals(month)) {
			if (monthValue != null) {
				bean.setTenth(monthValue.doubleValue());
			} else {
				bean.setTenth(0d);
			}
		}
		if (Constants.month_11.equals(month)) {
			if (monthValue != null) {
				bean.setEleventh(monthValue.doubleValue());
			} else {
				bean.setEleventh(0d);
			}
		}
		if (Constants.month_12.equals(month)) {
			if (monthValue != null) {
				bean.setTwelfth(monthValue.doubleValue());
			} else {
				bean.setTwelfth(0d);
			}
		}
	}

	public static String getMonth(String kpiTime) {
		SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM");

		SimpleDateFormat monthFormate = new SimpleDateFormat("MM");
		try {
			Date date = formate.parse(kpiTime);
			String month = monthFormate.format(date);
			return month;
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return null;

	}

}
